package com.demarc.pesquisas.infraestrutura.mensagem;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.xml.bind.annotation.XmlElement;

import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;

/**
 * Mensagem composta por uma chave e parâmetros.
 */
public class Mensagem {

	private String chave;
	private List<String> parametros = new ArrayList<String>();

	public Mensagem() {
		// Construtor padrão
	}

	public Mensagem(String chave, List<String> parametros) {
		if (chave == null) {
			throw new IllegalArgumentException("A chave não pode ser nula!");
		}
		this.chave = chave;
		this.parametros.addAll(parametros);
	}

	public Mensagem(String chave, String... parametros) {
		this(chave, Arrays.asList(parametros));
	}

	/**
	 * Recupera a chave da mensagem.
	 * 
	 * @return chave da mensagem.
	 */
	@XmlElement(name = "descricao")
	public String getChave() {
		return chave;
	}

	/**
	 * Configura a chave da mensagem.
	 * 
	 * @param chave
	 *            chave da mensagem.
	 */
	public void setChave(String chave) {
		this.chave = chave;
	}

	/**
	 * Recupera os parâmetros da mensagem.
	 * 
	 * @return parâmetros da mensagem.
	 */
	public List<String> getParametros() {
		return parametros;
	}

	/**
	 * Configura os parâmetros da mensagem.
	 * 
	 * @param parametros
	 *            parâmetros da mensagem.
	 */
	public void setParametros(List<String> parametros) {
		this.parametros = parametros;
	}

	/** {@inheritDoc} */
	@Override
	public boolean equals(Object obj) {
		boolean iguais = false;
		if (obj == this) {
			iguais = true;
		} else if (obj instanceof Mensagem) {
			Mensagem objeto = (Mensagem) obj;
			iguais = new EqualsBuilder().append(chave, objeto.chave)
					.append(parametros, objeto.getParametros()).isEquals();
		}
		return iguais;
	}

	/** {@inheritDoc} */
	@Override
	public int hashCode() {
		return new HashCodeBuilder().append(chave).append(parametros)
				.toHashCode();
	}

	/** {@inheritDoc} */
	@Override
	public String toString() {
		return new ToStringBuilder(this).append("chave", chave)
				.append("parametros", parametros).toString();
	}
}